'''
Gradio交互函数
'''
import gradio as gr
import os
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_community.llms import Ollama
from langchain_core.exceptions import LangChainException

# 配置默认模型参数
DEFAULT_MODEL_TYPE = "ollama"  # 可选: "openai", "anthropic", "ollama"
DEFAULT_MODEL_NAME = "qwen:7b-chat-q4_0"  # 根据模型类型选择合适的模型名

def getLLM():
    """获取配置的语言模型实例"""
    try:
        if DEFAULT_MODEL_TYPE == "openai":
            # OpenAI模型配置
            api_key = os.getenv("OPENAI_API_KEY")
            if not api_key:
                raise ValueError("请设置OPENAI_API_KEY环境变量")

            return ChatOpenAI(
                model_name=DEFAULT_MODEL_NAME,
                temperature=0.7,
                api_key=api_key
            )

        elif DEFAULT_MODEL_TYPE == "anthropic":
            # Anthropic模型配置
            api_key = os.getenv("ANTHROPIC_API_KEY")
            if not api_key:
                raise ValueError("请设置ANTHROPIC_API_KEY环境变量")

            return ChatAnthropic(
                model=DEFAULT_MODEL_NAME,
                temperature=0.7,
                api_key=api_key
            )

        elif DEFAULT_MODEL_TYPE == "ollama":
            # 本地Ollama模型配置
            return Ollama(
                model=DEFAULT_MODEL_NAME,
                temperature=0.7
            )

        else:
            raise ValueError(f"不支持的模型类型: {DEFAULT_MODEL_TYPE}")

    except Exception as e:
        raise LangChainException(f"模型初始化失败: {str(e)}")

def chat_with_bot(user_input):
    """处理用户输入并返回模型响应"""
    if not user_input.strip():
        return "请输入内容后再发送"

    try:
        llm = getLLM()
        response = llm.invoke(user_input)

        # 兼容不同模型的响应格式
        if hasattr(response, 'content'):
            return response.content
        return str(response)

    except Exception as e:
        return f"发生错误: {str(e)}"

# Gradio界面配置
with gr.Blocks(title="LangChain-Gradio聊天界面") as iface:
    gr.Markdown("# LangChain-Gradio聊天界面")
    gr.Markdown("与配置的大语言模型进行对话交互")

    input_text = gr.Textbox(label="输入内容", placeholder="请在这里输入你的问题...")
    output_text = gr.Textbox(label="回复内容")
    submit_btn = gr.Button("发送")

    # 设置提交事件
    submit_btn.click(
        fn=chat_with_bot,
        inputs=input_text,
        outputs=output_text
    )

    # 支持回车键提交
    input_text.submit(
        fn=chat_with_bot,
        inputs=input_text,
        outputs=output_text
    )

# 启动应用（支持外部访问）
if __name__ == "__main__":
    # 原 Gradio 启动部分修改
    iface.launch(
        server_name="112.44.79.7",  # 让服务监听所有网络接口，允许外部通过服务器IP访问
        server_port=64342,  # 指定端口，和服务器开放端口对应，也可换其他如8080等
        # share=True,          # 可选，生成临时公网链接，适合快速测试但有有效期
    )
